<?php

/*
 *Author:abel1314520@gmail.com
 *
 *功能：
 *	1 遍历目录下的所有文件（可指定后缀名）
 *	2 批量替换文件内容（正则、字符串）
 *	3 批量替换文件后缀名
 *	4 批量替换文件编码
*/
class DirExplorerClass{
	var $dirPath_array = array();//遍历文件结果集合

	function __construct(){
		//donothing
	}

	/*
	*  return a directory handle or die
        */
	private function openDir($dirPath_target) {
		if (is_dir($dirPath_target)) {
			return opendir($dirPath_target);
		}else {
			die("$dirPath_target is Not a Directory");
		}
	}

	/*
	*  close a directory handle
        */
	private function closeDir($dirHander) {
		closedir($dirHander);
	}

	/*
	*  遍历指定目录，返回其下的文件名集合
	*
	*  Parameters:
	*  	1 dirPath:需要遍历的文件夹
	*  	2 extension:只返回指定后缀名的文件 
	*  Return:
	*  	遍历文件结果集合
        */
	function getDirExplorer($dirPath,$extension=''){
		$dirHander=$this->openDir($dirPath);
		while($fileName = readdir($dirHander)){
			if($fileName !='.' && $fileName !='..'){
				$path = $dirPath."/" . $fileName;
				if(is_dir($path)){
					$this->getDirExplorer($path);
				}else{
					if(isset($extension) && $extension != ''){
						$fileExtension = end(explode('.',$fileName));
						if($fileExtension != $extension){
							continue;
						}
					}
					$this->dirPath_array[]=$path;
				}
			}
		}
		$this->closeDir($dirHander);
		return $this->dirPath_array;
	}

	/*
	*  字符串替换文件内容（忽略大小写）、编码、后缀名
	*
	*  Parameters:
	*  	1 search:	需要替换的字符串 （数组可)
	*  	2 replace:	替换后的字符串 （数组可)
	*  	3 in_charset:	原编码
	*  	4 out_charset:	新编码
	*  	5 in_extension:	原后缀名
	*  	6 out_extension:新后缀名
	*  Return:
	*  	true or false
        */
	function modifyFileBy_ireplace($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){
		/* input check */
		if(
			!isset($search) || !isset($replace) || 
			(strlen($in_charset)!=0 && strlen($in_charset)==0)  || (strlen($in_charset)==0 && strlen($in_charset)!=0) ||
			(strlen($in_extension)!=0 && strlen($out_extension)==0)  || (strlen($in_extension)==0 && strlen($out_extension)!=0)
		){
			return false;
		}

		foreach($this->dirPath_array as $key=>$file) {
			$content = file_get_contents($file);//read contents
			$content = str_ireplace($search, $replace, $content);

			if(strlen($in_charset)!=0 && strlen($out_charset)!=0){
				/* change the encode */
				$this->changeCharset($in_charset, $out_charset, 1, $content);
			}

			unlink($file);

			if(strlen($in_extension)!=0 && strlen($out_extension)!=0){
				/* change file's extension */
				$this->changeExtension($in_extension, $out_extension, 1, $file);
			}

			file_put_contents($file, $content);
			unset($content);

			/* 更新遍历文件名结果集 */
			$this->dirPath_array[$key] = $file;
		}
		return true;
	}

	/*
	*  字符串替换文件内容（区别大小写）、编码、后缀名
	*
	*  Parameters:
	*  	1 search:	需要替换的字符串 （数组可)
	*  	2 replace:	替换后的字符串 （数组可)
	*  	3 in_charset:	原编码
	*  	4 out_charset:	新编码
	*  	5 in_extension:	原后缀名
	*  	6 out_extension:新后缀名
	*  Return:
	*  	true or false
        */
	function modifyFileBy_replace($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){
		/* input check */
		if(
			!isset($search) || !isset($replace) || 
			(strlen($in_charset)!=0 && strlen($in_charset)==0)  || (strlen($in_charset)==0 && strlen($in_charset)!=0) ||
			(strlen($in_extension)!=0 && strlen($out_extension)==0)  || (strlen($in_extension)==0 && strlen($out_extension)!=0)
		){
			return false;
		}

		foreach($this->dirPath_array as $key=>$file) {
			$content = file_get_contents($file);//read contents
			$content = str_replace($search, $replace, $content);

			if(strlen($in_charset)!=0 && strlen($out_charset)!=0){
				/* change the encode */
				$this->changeCharset($in_charset, $out_charset, 1, $content);
			}

			unlink($file);

			if(strlen($in_extension)!=0 && strlen($out_extension)!=0){
				/* change file's extension */
				$this->changeExtension($in_extension, $out_extension, 1, $file);
			}

			file_put_contents($file, $content);
			unset($content);

			/* 更新遍历文件名结果集 */
			$this->dirPath_array[$key] = $file;
		}
		return true;
	}

	/*
	*  正则替换文件内容（忽略大小写）、编码、后缀名
	*
	*  Parameters:
	*  	1 search:	需要替换内容的正则表达式
	*  	2 replace:	替换后的字符串
	*  	3 in_charset:	原编码
	*  	4 out_charset:	新编码
	*  	5 in_extension:	原后缀名
	*  	6 out_extension:新后缀名
	*  Return:
	*  	true or false
        */
	function modifyFileBy_regex($search, $replace, $in_charset='', $out_charset='', $in_extension='', $out_extension=''){
		/* input check */
		if(
			!isset($search) || !isset($replace) || 
			(strlen($in_charset)!=0 && strlen($in_charset)==0)  || (strlen($in_charset)==0 && strlen($in_charset)!=0) ||
			(strlen($in_extension)!=0 && strlen($out_extension)==0)  || (strlen($in_extension)==0 && strlen($out_extension)!=0)
		){
			return false;
		}

		if(preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
			/* remove eval-modifier from $search */
			$search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
		}

		foreach($this->dirPath_array as $key=>$file) {
			$content = file_get_contents($file);//read contents
			$content = preg_replace($search, $replace, $content);

			if(strlen($in_charset)!=0 && strlen($out_charset)!=0){
				/* change the encode */
				$this->changeCharset($in_charset, $out_charset, 1, $content);
			}

			unlink($file);

			if(strlen($in_extension)!=0 && strlen($out_extension)!=0){
				/* change file's extension */
				$this->changeExtension($in_extension, $out_extension, 1, $file);
			}

			file_put_contents($file, $content);
			unset($content);

			/* 更新遍历文件名结果集 */
			$this->dirPath_array[$key] = $file;
		}
		return true;
	}

	/*
	*  变换编码
	*
	*  Parameters:
	*  	1 in_charset:	原编码
	*  	2 out_charset:	新编码
	*  	3 flag:		0对遍历得到的文件转换编码 1对指定内容转换编码
	*  	4 content:	仅在flag为1时使用
	*  Return:
	*  	true or false
        */
	function changeCharset($in_charset='', $out_charset='', $flag=0, &$content=''){
		/* input check */
		if (strlen($in_charset)==0 || strlen($out_charset)==0){
			return false;
		}

		if($flag == 0){
			/* 对遍历得到的文件转换编码 */
			foreach($this->dirPath_array as $file) {
				$content = file_get_contents($file);//read contents
				/* change the encode */
				$content = iconv($in_charset, $out_charset, $content);
				unlink($file);
				file_put_contents($file, $content);
				unset($content);
			}
		}else{
			/* 对指定内容转换编码 */
			if(strlen($content) != 0){
				$content = iconv($in_charset, $out_charset, $content);
			}
		}
		return true;
	}

	/*
	*  变换后缀名
	*
	*  Parameters:
	*  	1 in_extension:		原后缀名
	*  	2 out_extension:	新后缀名
	*  	3 flag:			0对遍历得到的文件变换后缀名 1对指定文件名变换后缀名
	*  	4 fileName:		仅在flag为1时使用
	*  Return:
	*  	true or false
        */
	function changeExtension($in_extension='', $out_extension='', $flag=0, &$fileName=''){
		/* inout check */
		if(strlen($in_extension)==0 || strlen($out_extension)==0){
			return false;
		}

		if($flag == 0){
			/* 对遍历得到的文件变换后缀名 */
			foreach($this->dirPath_array as $key=>$file) {
				/* change file's extension */
				$tmp = explode('.',$file);
				$nowExtension = array_pop($tmp);
				if($nowExtension == $in_extension){
					$content = file_get_contents($file);//read contents
					unlink($file);
					$file = implode('.',$tmp).'.'.$out_extension;
					file_put_contents($file, $content);
					unset($content);
				}
				/* 更新遍历文件名结果集 */
				$this->dirPath_array[$key] = $file;
			}

		}else{
			/* 对指定文件名变换后缀名 */
			if(strlen($fileName) != 0){
				$tmp = explode('.',$fileName);
				$nowExtension = array_pop($tmp);
				if($nowExtension == $in_extension){
					$fileName = implode('.',$tmp).'.'.$out_extension;
				}
			}
		}
		return true;
	}

}

?>

<?php
//使用例

$dirExplorer = new DirExplorerClass();
$dirExplorer->getDirExplorer('D:/test1/test2/');                                  //遍历目录D:/test1/test2/
$dirExplorer->modifyFileBy_replace('aa','QQ','shift-jis','UTF-8','txt','TXT');    //将所有文件内容中的aa替换为QQ,文件编码从shift-jis转换为UTF-8,将所有txt的后缀名改为TXT




echo "OK";
?>
